#include <iostream>
#include<unordered_set>
// TIP 要<b>Run</b>代码，请按 <shortcut actionId="Run"/> 或点击装订区域中的 <icon src="AllIcons.Actions.Execute"/> 图标。
using namespace std;

class Solution {
public:
    void QueryTop(const vector<string>& input, vector<string>& result, int n) {
        unordered_map<string, int> freq;

        // 1. 统计频次
        for (const auto& s : input) {
            ++freq[s];
        }

        // 2. 用小根堆保存前 n 个
        using Pair = pair<int, string>; // (频次, 字符串)
        auto cmp = [](const Pair& a, const Pair& b) {
            return a.first > b.first; // 小根堆
        };
        priority_queue<Pair, vector<Pair>, decltype(cmp)> pq(cmp);

        for (auto& kv : freq) {
            pq.push({kv.second, kv.first});
            if ((int)pq.size() > n) pq.pop();
        }

        // 3. 将结果倒序取出（大到小）
        vector<Pair> tmp;
        while (!pq.empty()) {
            tmp.push_back(pq.top());
            pq.pop();
        }
        reverse(tmp.begin(), tmp.end());

        result.clear();
        for (auto& p : tmp) {
            result.push_back(p.second);
        }
    }
};


class Solution1 {
public:
    string getTeam(string students) {
        unordered_set<char> seen;    // 记录已选择的班级
        string result;

        // 从队列末尾向前扫描
        for (int i = (int)students.size() - 1; i >= 0; i--) {
            char c = students[i];
            if (!seen.count(c)) {
                seen.insert(c);
                result.push_back(c);
            }
        }

        // 翻转得到正序
        reverse(result.begin(), result.end());
        return result;
    }
};

class Solution2 {
public:
    bool arrage_function(vector<int>& value, int M) {
        if (value.empty()) return false;

        int mn = *min_element(value.begin(), value.end());
        int mx = *max_element(value.begin(), value.end());

        if (M <= mn || M >= mx) {
            return false;
        }

        // 过滤掉大于 M 的元素
        vector<int> newValue;
        for (int x : value) {
            if (x <= M) newValue.push_back(x);
        }
        newValue.push_back(M);

        sort(newValue.begin(), newValue.end());
        value = move(newValue);

        return true;
    }
};